const obj = {
    a: 1,
    b: 2,
}

// 获取对象属性描述符
Object.getOwnPropertyDescriptor(obj, 'a') // {value: 1, writable: true, enumerable: true, configurable: true}

// 设置对象属性描述符
Object.defineProperty(obj, 'a', {
    value: 3,
    writable: false, // 不能修改属性值
    enumerable: false, // 不能遍历属性(枚举)
    configurable: false, // 不能修改属性描述符
}) 

// 根据上面设置 configurable 为 false, 所以不能重新定义属性描述符
// Object.defineProperty(obj, 'a', {
//     writable: true,
// }) 

obj.a = 4 // 不能修改属性值
console.log(obj.a) // 3

for (let key in obj) {
    console.log(key); // 输出 b, 因为 a 被设置为不可遍历
}

Object.keys(obj) // ["b"] // 输出 b, 因为 a 被设置为不可遍历